package com.vehiclemanagement.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vehiclemanagement.entity.ETCParking;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * ETC停车记录Mapper接口
 */
@Mapper
public interface ETCParkingMapper extends BaseMapper<ETCParking> {

    /**
     * 自定义分页查询，包含车辆、驾驶员和ETC卡信息
     *
     * @param page     分页对象
     * @param whereSql 自定义WHERE条件
     * @return 分页结果
     */
    IPage<ETCParking> selectPageWithInfo(Page<ETCParking> page, @Param("whereSql") String whereSql);

    /**
     * 根据车辆ID获取总停车费用
     *
     * @param vehicleId 车辆ID
     * @return 总停车费用
     */
    BigDecimal sumFeeByVehicleId(@Param("vehicleId") Long vehicleId, 
                                @Param("startTime") LocalDateTime startTime, 
                                @Param("endTime") LocalDateTime endTime);

    /**
     * 根据驾驶员ID获取总停车费用
     *
     * @param driverId 驾驶员ID
     * @return 总停车费用
     */
    BigDecimal sumFeeByDriverId(@Param("driverId") Long driverId, 
                              @Param("startTime") LocalDateTime startTime, 
                              @Param("endTime") LocalDateTime endTime);

    /**
     * 根据ETC卡ID获取总停车费用
     *
     * @param etcCardId ETC卡ID
     * @return 总停车费用
     */
    BigDecimal sumFeeByEtcCardId(@Param("etcCardId") Long etcCardId, 
                               @Param("startTime") LocalDateTime startTime, 
                               @Param("endTime") LocalDateTime endTime);

    /**
     * 按月统计停车费用
     *
     * @param year  年份
     * @param month 月份
     * @return 按月统计的停车费用
     */
    List<Map<String, Object>> statisticsByMonth(@Param("year") Integer year, @Param("month") Integer month);

    /**
     * 获取ETC停车记录统计
     *
     * @param year  年份
     * @param month 月份
     * @return ETC停车记录统计
     */
    List<Map<String, Object>> getETCParkingStatistics(@Param("year") Integer year, @Param("month") Integer month);

    /**
     * 物理删除记录
     *
     * @param id 记录ID
     * @return 影响行数
     */
    @Delete("DELETE FROM etc_parking WHERE id = #{id}")
    int deletePhysically(@Param("id") Long id);
} 